home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / TEGL6B.ARJ / TUTOR.COM / PICKLIST.TXT < prev    next >
Text File  |  1991-08-16  |  8KB  |  286 lines

  1. PICKLISTS
  2. -----------------------------------------------------------
  3.  
  4. There are three steps to creating a picklist.
  5.  
  6.        1. Create the pick list pointer.
  7.        2. Add items to the pick list.
  8.        3. Attach the pick list to a frame.
  9.  
  10. Function  CreatePickList(Fonttype:Pointer):OptionMPtr;
  11.  
  12. Creates the initial picklist pointer. Note that a picklist is built
  13. up from the same list as a menu.
  14.  
  15.  
  16. Procedure DefinePickItem(OM:OptionMptr; EntryStr:String; EntryCallProc:callproc; var pickitem:string);
  17.  
  18. Adds an item to the pick list.
  19.  
  20. The OM is the picklist previously created with a call to CreatePickList.
  21. EntryStr is the next item to be added to the pick list. EntryCallProc is an
  22. event-handler to call when the item is `picked'. Note that you must define
  23. a this event-handler EVEN IF IT DOES NOTHING. Do not use NilUnitProc here.
  24.  
  25. Pickitem is a string where a copy of the EntryStr is put. Generally all the
  26. entries for a given pick list would use the PickItem.
  27.  
  28. procedure DefinePicklistArea(fs:imagestkptr; x,y,oeselect,displaynum:word; om:optionmptr);
  29.  
  30. Attaches and displays a pick list on a frame.
  31.  
  32. The fs is the frame the picklist is being attached to. x,y are the coordinates
  33. of the upper left corner of the pick list. These are relative to the frame.
  34.  
  35. OESelect is the item to show as selected on entry to the picklist. If OESelect
  36. is greater that the number of entries in the picklist then no item is
  37. selected.
  38.  
  39. DisplayNum is the number of items to display on the picklist. DisplayNum must
  40. be greater than 0. 1 is a special instance for the picklist, when used the
  41. picklist is converted to a Drop-Down pick list. That is, only the selected
  42. entry is shown with a button to the right. When the button is pressed the
  43. pick list is dropped-down. If DisplayNum is less that the total number of
  44. picklist items then a scroll bar is displayed on the picklist, both regular
  45. and drop-down picklists.
  46.  
  47. Here is a simple program that displays a pick list.
  48.  
  49. BEGINFILE> pick1.pas
  50. {-- Pick1.pas}
  51. {$F+}
  52. USES
  53.   teglfont, teglintr, teglunit, teglmain, teglmenu, teglpick;
  54.  
  55.  
  56. VAR
  57.   ispicked : String;
  58.  
  59.  
  60. Function WasPicked(ifs: ImageStkPtr; ms : MsClickPtr): Word;
  61.   BEGIN
  62.  
  63.     WasPicked := 1;
  64.   END;
  65.  
  66.  
  67. Procedure CreatePickFrame;
  68.  
  69.   VAR pom : OptionMPtr;
  70.       ifs : ImageStkPtr;
  71.   BEGIN
  72.     QuickFrame(ifs,100,100,100,100);
  73.     pom := CreatePickList(@f8x8bold);
  74.     SetPickListMargin(pom,12);
  75.     DefinePickItem(pom,'Item 1',WasPicked,ispicked);
  76.     DefinePickItem(pom,'Item 2',WasPicked,ispicked);
  77.     DefinePickItem(pom,'Item 3',WasPicked,ispicked);
  78.     DefinePickListArea(ifs,10,10,2,5,pom);
  79.   END;
  80.  
  81. BEGIN
  82.   easytegl;
  83.   easyout;
  84.   CreatePickFrame;
  85.  
  86.   TeglSupervisor;
  87.  
  88. END.
  89. ENDFILE>
  90.  
  91. Of course a real program would do something with the result of the
  92. pick. It's easy to tie in the pick event to another event that will
  93. look after the result.
  94.  
  95. BEGINFILE> pick2.pas
  96. {-- Pick2.pas}
  97. {$F+}
  98. USES
  99.   teglfont, tgraph, teglintr, teglunit, teglmain, teglmenu, teglpick;
  100.  
  101.  
  102. VAR
  103.   ispicked : String;
  104.  
  105.  
  106. Function WasPicked(ifs: ImageStkPtr; ms : MsClickPtr): Word;
  107.   VAR locfs : ImageStkPtr;
  108.   BEGIN
  109.     dropstackimage(ifs);
  110.     quickframe(ifs,200,200,100,100);
  111.     setcolor(black);
  112.     OutTextXY(210,210,ispicked);
  113.   END;
  114.  
  115.  
  116. Procedure CreatePickFrame;
  117.  
  118.   VAR pom : OptionMPtr;
  119.       ifs : ImageStkPtr;
  120.   BEGIN
  121.     QuickFrame(ifs,100,100,100,100);
  122.     pom := CreatePickList(@f8x8bold);
  123.     SetPickListMargin(pom,12);
  124.     DefinePickItem(pom,'Item 1',WasPicked,ispicked);
  125.     DefinePickItem(pom,'Item 2',WasPicked,ispicked);
  126.     DefinePickItem(pom,'Item 3',WasPicked,ispicked);
  127.     DefinePickListArea(ifs,10,10,2,5,pom);
  128.   END;
  129.  
  130. BEGIN
  131.   easytegl;
  132.   easyout;
  133.   CreatePickFrame;
  134.  
  135.   TeglSupervisor;
  136.  
  137. END.
  138. ENDFILE>
  139.  
  140. Here is a fairly complete and useful example of a picklist reading the
  141. directory and displaying it. It also shows how to handle it when a
  142. file is double clicked on. A more comprehensive routine would sort
  143. the filenames before sending them to the picklist and some mechanism
  144. would enable the user to move through directories.
  145.  
  146. BEGINFILE> pick3.pas
  147. {-- pick3.pas }
  148.  
  149. uses dos,
  150.  
  151.      teglfont, fastgrph, tgraph,
  152.      teglintr, teglunit, teglmain, teglmenu, teglpick;
  153.  
  154. {$F+}
  155.  
  156. VAR
  157.   ispicked : String;   {-- stores the picked file name }
  158.  
  159. {-- drops the picklist when the frame is disposed of }
  160.  
  161. function droppicklist(fs:ImageStkPtr; Userkey:word; Var DataArea):Word;
  162.    var picklist : optionmptr absolute DataArea;
  163.    begin
  164.       dropoptionmenu(picklist);
  165.       droppicklist := 0;
  166.    END;
  167.  
  168. {-- simple, but handy }
  169.  
  170. Procedure SetViewPortToFrame(ifs: ImageStkPtr);
  171.   BEGIN
  172.     SetViewPort(ifs^.x,ifs^.y,ifs^.x1,ifs^.y1,clipon);
  173.   END;
  174.  
  175. {-- this event is called whenever a an item is clicked on }
  176.  
  177. Function WasPicked(ifs: ImageStkPtr; ms : MsClickPtr): Word;
  178.   BEGIN
  179.     SetViewPortToFrame(ifs);          {-- set relative to frame }
  180.     SetFillStyle(solidfill,white);    {-- usual colors }
  181.     bar(10,10,140,20);                {-- bar out old file name }
  182.     SetColor(BLACK);                  {-- black letters }
  183.     OutTextXY(10,10,ispicked);        {-- show selection }
  184.     {-- left double click just checks to see if the left mouse button }
  185.     {-- was pressed again (within the double click delay) after entering }
  186.     {-- this function. If so then it means the file was selected and we }
  187.     {-- should exit. }
  188.  
  189.     if LeftDoubleClick then dropstackimage(ifs);
  190.     WasPicked := 0;
  191.   END;
  192.  
  193. {-- just tidy up the files name to make it more acceptable in the pick }
  194. {-- list view. }
  195.  
  196. Function FmtFileName(s : String): String;
  197.   VAR
  198.     s1,s2 : String[20];
  199.   BEGIN
  200.     if Pos('.',s) > 0 then
  201.       begin
  202.         s1 := copy(s,1,pos('.',s)-1);
  203.         s2 := copy(s,pos('.',s),255);
  204.         while length(s1) < 8 do s1 := s1 + ' ';
  205.         s := s1 + s2;
  206.       end
  207.     else
  208.       while length(s) < 12 do s := s + ' ';
  209.     fmtFileName := s + ' ';
  210.   END;
  211.  
  212. {-- searchrec, findfirst etc. are in your TURBO manual }
  213.  
  214. Procedure GetFileName(Path : PathStr;FileArg: PathStr; Attr : Word);
  215.  
  216. VAR
  217.   dd : SearchRec;       {-- store directory entries }
  218.   pom : OptionMPtr;
  219.   ifs :ImageStkPtr;
  220.   BEGIN
  221.     if path[length(path)] <> '\' then path := path + '\';
  222.     QuickFrame(ifs,100,100,200,200);
  223.     SetProportional(FALSE);
  224.     pom := CreatePickList(@f8x8bold);
  225.     SetUserDataArea(StackPtr,5432,pom,droppicklist);
  226.     SetViewPortToFrame(ifs);
  227.     SetTEGLFont(@f8x8bold);
  228.     SetColor(BLACK);
  229.     Rectangle(5,5,150,23);
  230.     OutTextXY(10,10,FileArg);
  231.     OutTextXY(10,35,Path);
  232.     FindFirst(path+FileArg,attr,dd);
  233.     WHILE (DosError <> 18) DO
  234.       BEGIN
  235.         definePickItem(pom,fmtfilename(dd.name),WasPicked,ispicked);
  236.         FindNext(dd);
  237.       END;
  238.     {-- attach it }
  239.     DefinePickListArea(ifs,10,60,0,12,pom);
  240.  
  241.   END;
  242.  
  243.  
  244. VAR curDir : String;
  245. BEGIN
  246.   easytegl;
  247.   easyout;
  248.   GetDir(0,curdir);                    {-- for example just load the names }
  249.   GetFileName(curdir,'*.*', Archive);  {-- of all the files in the current }
  250.                                        {-- directory. }
  251.   TeglSupervisor;
  252.  
  253. END.
  254. ENDFILE>
  255. procedure ClearPickList(OM:OptionMptr);
  256.  
  257. Resets a pick list. All the entries are disposed of but the picklist is
  258. not. After ClearPickList is the same as having just created a picklist
  259. using CreatePickList.
  260.  
  261. procedure SetPickListWidth(om: Optionmptr; maxwidth:word);
  262.  
  263. Set the maximum width of the picklist.
  264.  
  265. OM is a pickllist previously created with CreatePickList. MaxWidth is the
  266. maximim width of the picklist in pixels.
  267.  
  268. Procedure detachpicklist(OM:OptionMPtr);
  269.  
  270. procedure attachpicklist(om:optionmptr; oeselect:word);
  271.  
  272. procedure SetPickListMargin(om:optionmptr; marginw:word);
  273.  
  274. Sets the margin around the text of the picklist.
  275.  
  276. OM is a picklist previously created with CreatePickList. MarginW is the margin,
  277. in pixels, on the left and right side of the text.
  278.  
  279. ---------
  280. Picklists can be disposed of with a call to DropOptionMenu since they use
  281. the same data structure and list mechanism as option menus.
  282.  
  283. DropOptionMenu(OM : OptionMPtr);
  284.  
  285. ---- END picklist.txt
  286.